package gui.standard.form;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.sql.SQLException;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

import model.tablemodel.AnalitikaMagacinskeKarticeTableModel;
import net.miginfocom.swing.MigLayout;
import util.components.JDecimalTextField;
import util.components.JDigitsTextField;
import util.components.JIznosTextField;
import util.components.JLimitedTextField;
import util.exceptions.NegativeValueException;
import actions.standard.form.ZoomFormAction;

public class AnalitikaMagacinskeKarticeForm extends StandardForm {

	private static final long serialVersionUID = 1L;
	private JLimitedTextField tfSifraPreduzeca;
	private JLimitedTextField tfSifraSektora;
	private JLimitedTextField tfSifraMagacina;
	private JLimitedTextField tfSifraGrupe;
	private JDigitsTextField tfSifraArtikala;
	private JDigitsTextField tfPoslovnaGodina;
	private JDigitsTextField tfRedniBrojAnMagKart;
	private JDigitsTextField tfBrojPrometnogDok;
	private JTextField tfDatumNastankaPrometnogDok;
	private JDigitsTextField tfRedniBrojStPromDok;
	private JTextField tfDatumPromene;
	private JTextField tfVrDokumenta;
	private JTextField tfSifraDokumenta;
	private JDecimalTextField tfKolicina;
	private JIznosTextField tfCena;
	private JIznosTextField tfVrednost;
	private JLimitedTextField tfSmer;

	private JButton bMagacinskaKarticaZoom;
	private JButton bStavkaPrometnogDokumentaZoom;

	public AnalitikaMagacinskeKarticeForm() {

	}
	
	@Override
	public void init(){
		
		super.init();

		tfSifraPreduzeca = new JLimitedTextField(12, 12, true);
		tfSifraSektora = new JLimitedTextField(12, 12, true);
		tfSifraMagacina = new JLimitedTextField(12, 12, true);
		tfSifraGrupe = new JLimitedTextField(12, 12, true);
		tfSifraArtikala = new JDigitsTextField(12, 12, true, true);
		tfPoslovnaGodina = new JDigitsTextField(4, 4, false, false);
		tfRedniBrojAnMagKart = new JDigitsTextField(10, 10, true, true);
		tfBrojPrometnogDok = new JDigitsTextField(10, 10, true, true);
		tfDatumNastankaPrometnogDok = new JTextField(12);
		tfRedniBrojStPromDok = new JDigitsTextField(10, 10, true, true);
		tfDatumPromene = new JTextField(12);
		tfVrDokumenta = new JLimitedTextField(1, 1, false);
		tfSifraDokumenta = new JLimitedTextField(12, 12, true);
		tfKolicina = new JDecimalTextField(13, 12, 2, ',', true);
		tfCena = new JIznosTextField(13, 12, 2, false);
		tfVrednost = new JIznosTextField(13, 12, 2, false);
		tfSmer = new JLimitedTextField(1, 1, false);
		
		tfVrednost.setEditable(false);
		
		tfKolicina.getDocument().addDocumentListener(new DocumentListener() {
			
			@Override
			public void removeUpdate(DocumentEvent arg0) {
				// TODO Auto-generated method stub
				try {
					tfVrednost.setValue(new BigDecimal(tfKolicina.getValue() * tfCena.getValue().doubleValue()));
				} catch (NegativeValueException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			@Override
			public void insertUpdate(DocumentEvent arg0) {
				// TODO Auto-generated method stub
				try {
					tfVrednost.setValue(new BigDecimal(tfKolicina.getValue() * tfCena.getValue().doubleValue()));
				} catch (NegativeValueException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			@Override
			public void changedUpdate(DocumentEvent arg0) {
				// TODO Auto-generated method stub
			}
		});
		
		tfCena.getDocument().addDocumentListener(new DocumentListener() {
			
			@Override
			public void removeUpdate(DocumentEvent arg0) {
				// TODO Auto-generated method stub
				try {
					tfVrednost.setValue(new BigDecimal(tfKolicina.getValue() * tfCena.getValue().doubleValue()));
				} catch (NegativeValueException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			@Override
			public void insertUpdate(DocumentEvent arg0) {
				// TODO Auto-generated method stub
				try {
					tfVrednost.setValue(new BigDecimal(tfKolicina.getValue() * tfCena.getValue().doubleValue()));
				} catch (NegativeValueException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			@Override
			public void changedUpdate(DocumentEvent arg0) {
				// TODO Auto-generated method stub
			}
		});
		
		setTitle("Analitika magacinske kartice");
		
		tableModel = new AnalitikaMagacinskeKarticeTableModel(
				new String[] { "Sifra preduzeca", "Sifra sektora",
						"Sifra Magacina", "Sifra grupe", "Sifra artikala",
						"Poslovna godina", "Redni broj an. mag. kartice",
						"Broj prometnog dok", "Datum nastanka prometnog dok",
						"Redni broj st. prom. dok.", "Datum promene",
						"Vr dokumenta", "Sifra dokumenta", "Kolicina", "Cena",
						"Vrednost", "Smer" }, 0);
		
		tblGrid.setModel(tableModel);
		
		bMagacinskaKarticaZoom = new JButton(new ZoomFormAction(
				this, new MagacinskaKarticaForm()));
		bStavkaPrometnogDokumentaZoom = new JButton(
				new ZoomFormAction(this, new StavkaPrometnogDokumentaForm()));

		JPanel bottomPanel = new JPanel();
		bottomPanel.setLayout(new MigLayout("fillx"));
		JPanel dataPanel = new JPanel();
		dataPanel.setLayout(new MigLayout("gapx 15px"));

		JLabel lblSifraPreduzeca = new JLabel("Sifra preduzeca:");
		JLabel lblSifraSektora = new JLabel("Sifra sektora:");
		JLabel lblSifraMagacina = new JLabel("Sifra magacina:");
		JLabel lblSifraGrupe = new JLabel("Sifra grupe:");
		JLabel lblSifraArtikala = new JLabel("Sifra artikala:");
		JLabel lblPoslovnaGodina = new JLabel("Poslovna godina:");
		JLabel lblRedniBrojAnMagKart = new JLabel("Redni broj an. mag kartice:");
		JLabel lblBrojPrometnogDok = new JLabel("Broj prometnog dokumenta:");
		JLabel lblDatumNastankaPrometnogDok = new JLabel("Datum nastanka:");
		JLabel lblRedniBrojStPromDok = new JLabel("Redni broj st. prom. dok:");
		JLabel lblDatumPromene = new JLabel("Datum promene:");
		JLabel lblVrDokumenta = new JLabel("Vr. dokumenta:");
		JLabel lblSifraDokumenta = new JLabel("Sifra dokumenta:");
		JLabel lblKolicina = new JLabel("Kolicina:");
		JLabel lblCena = new JLabel("Cena:");
		JLabel lblVrednost = new JLabel("Vrednost:");
		JLabel lblSmer = new JLabel("Smer:");

		dataPanel.add(lblSifraPreduzeca);
		dataPanel.add(tfSifraPreduzeca, "wrap");
		dataPanel.add(lblSifraSektora);
		dataPanel.add(tfSifraSektora, "pushx");
		dataPanel.add(lblSifraMagacina);
		dataPanel.add(tfSifraMagacina);
		dataPanel.add(bMagacinskaKarticaZoom, "wrap");
		dataPanel.add(lblSifraGrupe);
		dataPanel.add(tfSifraGrupe, "pushx");
		dataPanel.add(lblSifraArtikala);
		dataPanel.add(tfSifraArtikala, "wrap");
		dataPanel.add(lblPoslovnaGodina);
		dataPanel.add(tfPoslovnaGodina, "pushx");
		dataPanel.add(lblRedniBrojAnMagKart);
		dataPanel.add(tfRedniBrojAnMagKart, "wrap");
		dataPanel.add(lblBrojPrometnogDok);
		dataPanel.add(tfBrojPrometnogDok, "pushx");
		dataPanel.add(lblDatumNastankaPrometnogDok);
		dataPanel.add(tfDatumNastankaPrometnogDok);
		dataPanel.add(bStavkaPrometnogDokumentaZoom, "wrap");
		dataPanel.add(lblRedniBrojStPromDok);
		dataPanel.add(tfRedniBrojStPromDok, "pushx");
		dataPanel.add(lblDatumPromene);
		dataPanel.add(tfDatumPromene, "wrap");
		dataPanel.add(lblVrDokumenta);
		dataPanel.add(tfVrDokumenta, "pushx");
		dataPanel.add(lblSifraDokumenta);
		dataPanel.add(tfSifraDokumenta, "wrap");
		dataPanel.add(lblKolicina);
		dataPanel.add(tfKolicina, "pushx");
		dataPanel.add(lblCena);
		dataPanel.add(tfCena, "wrap");
		dataPanel.add(lblVrednost);
		dataPanel.add(tfVrednost, "pushx");
		dataPanel.add(lblSmer);
		dataPanel.add(tfSmer, "wrap");
		bottomPanel.add(dataPanel);

		bottomPanel.add(buttonsPanel, "dock east");

		add(bottomPanel, "grow, wrap");
	}

	@Override
	public void sync() {
		// TODO Auto-generated method stub
		int index = tblGrid.getSelectedRow();
		if (index < 0) {
			tfSifraPreduzeca.setText("");
			tfSifraSektora.setText("");
			tfSifraMagacina.setText("");
			tfSifraGrupe.setText("");
			tfSifraArtikala.setText("");
			tfPoslovnaGodina.setText("");
			tfRedniBrojAnMagKart.setText("");
			tfBrojPrometnogDok.setText("");
			tfDatumNastankaPrometnogDok.setText("");
			tfRedniBrojStPromDok.setText("");
			tfDatumPromene.setText("");
			tfVrDokumenta.setText("");
			tfSifraDokumenta.setText("");
			tfKolicina.setText("");
			tfCena.setText("");
			tfVrednost.setText("");
			tfSmer.setText("");
			return;
		}
		String sifraPreduzeca = (String) tableModel.getValueAt(index, 0);
		String sifraSektora = (String) tableModel.getValueAt(index, 1);
		String sifraMagacina = (String) tableModel.getValueAt(index, 2);
		String sifraGrupe = (String) tableModel.getValueAt(index, 3);
		String sifraArtikla = (String) tableModel.getValueAt(index, 4);
		String poslovnaGodina = (String) tableModel.getValueAt(index, 5);
		String redniBrojAnMagKart = (String) tableModel.getValueAt(index, 6);
		String brojPrometnogDok = (String) tableModel.getValueAt(index, 7);
		String datumNastankaPrometnogDok = (String) tableModel.getValueAt(
				index, 8);
		String redniBrojStPromDok = (String) tableModel.getValueAt(index, 9);
		String datumPromene = (String) tableModel.getValueAt(index, 10);
		String vrDokumenta = (String) tableModel.getValueAt(index, 11);
		String sifraDokumenta = (String) tableModel.getValueAt(index, 12);
		String kolicina = (String) tableModel.getValueAt(index, 13);
		String cena = (String) tableModel.getValueAt(index, 14);
		String vrednost = (String) tableModel.getValueAt(index, 15);
		String smer = (String) tableModel.getValueAt(index, 16);
		
		kolicina = kolicina.replace(",", ".");
		
		double dkolicina = Double.parseDouble(kolicina);
		double dcena = Double.parseDouble(cena);
		double dvrednost = Double.parseDouble(vrednost);
		
		BigDecimal bdcena = new BigDecimal(dcena);
		BigDecimal bdvrednost = new BigDecimal(dvrednost);

		tfSifraPreduzeca.setText(sifraPreduzeca);
		tfSifraSektora.setText(sifraSektora);
		tfSifraMagacina.setText(sifraMagacina);
		tfSifraGrupe.setText(sifraGrupe);
		tfSifraArtikala.setText(sifraArtikla);
		tfPoslovnaGodina.setText(poslovnaGodina);
		tfRedniBrojAnMagKart.setText(redniBrojAnMagKart);
		tfBrojPrometnogDok.setText(brojPrometnogDok);
		tfDatumNastankaPrometnogDok.setText(datumNastankaPrometnogDok);
		tfRedniBrojStPromDok.setText(redniBrojStPromDok);
		tfDatumPromene.setText(datumPromene);
		tfVrDokumenta.setText(vrDokumenta);
		tfSifraDokumenta.setText(sifraDokumenta);
		tfKolicina.setValue(dkolicina);
		try {
			tfCena.setValue(bdcena);
		} catch (NegativeValueException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		try {
			tfVrednost.setValue(bdvrednost);
		} catch (NegativeValueException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		tfSmer.setText(smer);

		setMode(StandardForm.MODE_EDIT);
	}

	@Override
	public void addRow() {
		// TODO Auto-generated method stub
		String sifraPreduzeca = tfSifraPreduzeca.getText().trim();
		String sifraSektora = tfSifraSektora.getText().trim();
		String sifraMagacina = tfSifraMagacina.getText().trim();
		String sifraGrupe = tfSifraGrupe.getText().trim();
		String sifraArtikla = tfSifraArtikala.getText().trim();
		String poslovnaGodina = tfPoslovnaGodina.getText().trim();
		String redniBrojAnMagKart = tfRedniBrojAnMagKart.getText().trim();
		String brojPrometnogDok = tfBrojPrometnogDok.getText().trim();
		String datumNastankaPrometnogDok = tfDatumNastankaPrometnogDok
				.getText().trim();
		String redniBrojStPromDok = tfRedniBrojStPromDok.getText().trim();
		String datumPromene = tfDatumPromene.getText().trim();
		String vrDokumenta = tfVrDokumenta.getText().trim();
		String sifraDokumenta = tfSifraDokumenta.getText().trim();
		String kolicina = Double.toString(tfKolicina.getValue());
		String cena = tfCena.getValue().toString();
		String vrednost = tfVrednost.getValue().toString();
		String smer = tfSmer.getText().trim();
		try {
			int index = tableModel.insertRow(new String[] { sifraPreduzeca,
					sifraSektora, sifraMagacina, sifraGrupe, sifraArtikla,
					poslovnaGodina, redniBrojAnMagKart, brojPrometnogDok,
					datumNastankaPrometnogDok, redniBrojStPromDok,
					datumPromene, vrDokumenta, sifraDokumenta, kolicina, cena,
					vrednost, smer });
			tblGrid.setRowSelectionInterval(index, index);
			setMode(MODE_ADD);
		} catch (SQLException ex) {
			JOptionPane.showMessageDialog(this, ex.getMessage(), "Greska",
					JOptionPane.ERROR_MESSAGE);
		}

	}

	@Override
	public void searchRow() {
		// TODO Auto-generated method stub
		String sifraPreduzeca = tfSifraPreduzeca.getText().trim();
		String sifraSektora = tfSifraSektora.getText().trim();
		String sifraMagacina = tfSifraMagacina.getText().trim();
		String sifraGrupe = tfSifraGrupe.getText().trim();
		String sifraArtikla = tfSifraArtikala.getText().trim();
		String poslovnaGodina = tfPoslovnaGodina.getText().trim();
		String redniBrojAnMagKart = tfRedniBrojAnMagKart.getText().trim();
		String brojPrometnogDok = tfBrojPrometnogDok.getText().trim();
		String datumNastankaPrometnogDok = tfDatumNastankaPrometnogDok
				.getText().trim();
		String redniBroj = tfRedniBrojStPromDok.getText().trim();
		String datumPromene = tfDatumPromene.getText().trim();
		String vrDokumenta = tfVrDokumenta.getText().trim();
		String sifraDokumenta = tfSifraDokumenta.getText().trim();
		String kolicina = Double.toString(tfKolicina.getValue());
		String cena = tfCena.getValue().toString();
		String vrednost = tfVrednost.getValue().toString();
		String smer = tfSmer.getText().trim();
		try {
			tableModel
					.searchRows(new String[] { sifraPreduzeca, sifraSektora,
							sifraMagacina, sifraGrupe, sifraArtikla,
							poslovnaGodina, redniBrojAnMagKart,
							brojPrometnogDok, datumNastankaPrometnogDok,
							redniBroj, datumPromene, vrDokumenta,
							sifraDokumenta, kolicina, cena, vrednost, smer });
		} catch (SQLException ex) {
			JOptionPane.showMessageDialog(this, ex.getMessage(), "Greska",
					JOptionPane.ERROR_MESSAGE);
		}

	}

	@Override
	public void editRow() {
		// TODO Auto-generated method stub
		String sifraPreduzeca = tfSifraPreduzeca.getText().trim();
		String sifraSektora = tfSifraSektora.getText().trim();
		String sifraMagacina = tfSifraMagacina.getText().trim();
		String sifraGrupe = tfSifraGrupe.getText().trim();
		String sifraArtikla = tfSifraArtikala.getText().trim();
		String poslovnaGodina = tfPoslovnaGodina.getText().trim();
		String redniBrojAnMagKart = tfRedniBrojAnMagKart.getText().trim();
		String brojPrometnogDok = tfBrojPrometnogDok.getText().trim();
		String datumNastankaPrometnogDok = tfDatumNastankaPrometnogDok
				.getText().trim();
		String redniBroj = tfRedniBrojStPromDok.getText().trim();
		String datumPromene = tfDatumPromene.getText().trim();
		String vrDokumenta = tfVrDokumenta.getText().trim();
		String sifraDokumenta = tfSifraDokumenta.getText().trim();
		String kolicina = Double.toString(tfKolicina.getValue());
		String cena = tfCena.getValue().toString();
		String vrednost = tfVrednost.getValue().toString();
		String smer = tfSmer.getText().trim();
		try {
			int index = tableModel.editRow(
					new String[] { sifraPreduzeca, sifraSektora, sifraMagacina,
							sifraGrupe, sifraArtikla, poslovnaGodina,
							redniBrojAnMagKart, brojPrometnogDok,
							datumNastankaPrometnogDok, redniBroj, datumPromene,
							vrDokumenta, sifraDokumenta, kolicina, cena,
							vrednost, smer }, tblGrid.getSelectedRow());
			tblGrid.setRowSelectionInterval(index, index);
		} catch (SQLException ex) {
			JOptionPane.showMessageDialog(this, ex.getMessage(), "Greska",
					JOptionPane.ERROR_MESSAGE);
		}

	}

	@Override
	public void setMode(int mode) {
		super.setMode(mode);

		if (mode != StandardForm.MODE_ADD)
			return;

		tfSifraPreduzeca.setText("");
		tfSifraSektora.setText("");
		tfSifraMagacina.setText("");
		tfSifraGrupe.setText("");
		tfSifraArtikala.setText("");
		tfPoslovnaGodina.setText("");
		tfRedniBrojAnMagKart.setText("");
		tfBrojPrometnogDok.setText("");
		tfDatumNastankaPrometnogDok.setText("");
		tfRedniBrojStPromDok.setText("");
		tfDatumPromene.setText("");
		tfVrDokumenta.setText("");
		tfSifraDokumenta.setText("");
		tfKolicina.setText("");
		tfCena.setText("");
		tfVrednost.setText("");
		tfSmer.setText("");
	}


	@Override
	public String[] getSelectedRowKeys() {
		// TODO Auto-generated method stub
		return new String[]{tfSifraPreduzeca.getText().trim(), tfSifraSektora.getText().trim(), tfSifraMagacina.getText().trim(), 
				tfSifraGrupe.getText().trim(), tfSifraArtikala.getText().trim(), tfPoslovnaGodina.getText().trim(), 
				tfRedniBrojAnMagKart.getText().trim()};
	}

	@Override
	public void getZoomedCol(String[] keys, StandardForm form) {
		// TODO Auto-generated method stub
		if(form instanceof MagacinskaKarticaForm){
			tfSifraPreduzeca.setText(keys[0]);
			tfSifraSektora.setText(keys[1]);
			tfSifraMagacina.setText(keys[2]);
			tfSifraGrupe.setText(keys[3]);
			tfSifraArtikala.setText(keys[4]);
			tfPoslovnaGodina.setText(keys[5]);
		}else if(form instanceof StavkaPrometnogDokumentaForm){
			tfSifraPreduzeca.setText(keys[0]);
			tfPoslovnaGodina.setText(keys[1]);
			tfBrojPrometnogDok.setText(keys[2]);
			tfDatumNastankaPrometnogDok.setText(keys[3]);
			tfRedniBrojStPromDok.setText(keys[4]);
		}
		
	}

	@Override
	public String[] getSelectedRowNextKeys(int index) {
		// TODO Auto-generated method stub
		return new String[]{tfSifraPreduzeca.getText().trim(), tfSifraSektora.getText().trim(), tfSifraMagacina.getText().trim(), 
				tfSifraGrupe.getText().trim(), tfSifraArtikala.getText().trim(), tfPoslovnaGodina.getText().trim(), 
				tfRedniBrojAnMagKart.getText().trim(), tfBrojPrometnogDok.getText().trim(), tfDatumNastankaPrometnogDok.getText().trim(), 
				tfRedniBrojStPromDok.getText().trim(), tfDatumPromene.getText().trim(), tfVrDokumenta.getText().trim(), tfSifraDokumenta.getText().trim(), 
				tfKolicina.getText().trim(), tfCena.getText().trim(), tfVrednost.getText().trim(), tfSmer.getText().trim()};
	}

}
